package com.cskaoyan.array;


import java.util.Arrays;

/*
        数组遍历(依次输出数组中的每一个元素)
        数组元素逆序
        对取值范围在1~100的数据集合排序 (计数排序)
        数组获取最值(获取数组中的最大值最小值)
        数组查表法(根据键盘录入索引,查找对应星期)
        数组元素查找(查找指定元素第一次在数组中出现的索引)

 */
public class Demo6Exercise {

    public static void main(String[] args) {
        // 第一题目标数组
//        int[] a = {10, 2, 14, 30, 5};
//        int[] b = {1};
//
//        printArray(a);
//        printArray(b);

        // 第二题
//        int[] c = {1, 2, 15, 20, 99};
//        reverseArray(c);
//        printArray(c);

        // 第三题
        int[] d = {10, 20, 15, 4, 3, 10, 40, 4, 4, 3};
//        countingSort(d);
//        printArray(d);


        // 第四题
//        int[] r = maxAndMin(d);
//        printArray(r);

        // 第五题
//        String s = weekOfDay(5);
//        System.out.println(s);

        // 第六题
        int i = find(d, 4);
        //System.out.println(i);

        // 关于数组元素的输出
        //System.out.println(d); //[I@1b6d3586

        // 可以通过jdk中的工具，直接获取数组中的元素值并输出
        // 改方法将数组中所有的元素值拼接成一个字符串返回给我们
        //String s = Arrays.toString(d);
        System.out.println(Arrays.toString(d));

    }


    /*
        第一题
     */
    public static void printArray(int[] a) {
        // 数组有一个属性length，表示的数组中的存储单元的数量即数组长度
        //int len = a.length;
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
        System.out.println();
    }

    /*
          第二题 数组元素逆序

     */
    public static void reverseArray(int[] a) {

        int tmp;
        for (int i = 0; i < a.length / 2; i++) {
            tmp = a[i];
            a[i] = a[a.length - 1 -i];
            a[a.length - 1 - i] = tmp;

        }

    }

    public static void countingSort(int[] a) {
        //  定义辅助数组，并初始化
        int[] tmp = new int[101];

        //遍历原始数组，给辅助数组赋初值
        for (int i = 0; i < a.length; i++) {
            // 将原始数组中的元素 ——> 辅助数组的数组下标
            int tmpIndex = a[i];
            // 记录a[i]元素值，出现的次数
            tmp[tmpIndex]++;
        }

        // 基于辅助数组实现排序
        // 遍历辅助数组

        // 该变量表示最终排序结果中，下一个待排序的位置
        int currentIndex = 0;
        // i 从1开始遍历
        for (int i = 1; i < tmp.length; i++) {
            // 获取值为i的元素出现的次数
            int count = tmp[i];
            for (int j = 0; j < count; j++) {
                // 把元素值i放到正确的排序位置
                a[currentIndex] = i;
                currentIndex++;
            }
        }
    }


    /*
         求数组中的最大值和最小值
         约定：第0个元素 最大值
               第1个元素 最小值
     */
    public static int[] maxAndMin(int[] a) {
        // 当前的最大值
        int max = a[0];
        // 当前的最小值
        int min = a[0];

        for (int i = 0; i < a.length; i++) {
            // 最大值比较
            if (a[i] > max) {
                max = a[i];
            }
            // 最小值比较
            if (a[i] < min) {
                min = a[i];
            }
        }

        int[] result = new int[2];
        result[0] = max;
        result[1] = min;
        return result;

//        System.out.println("max = " + max);
//        System.out.println("min = " + min);
    }

    /*
         第五题
     */
    public static String weekOfDay(int day) {
        // 规律 day这一天对应的名称数组下标 = day - 1
        String[] nameOfDay = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"};
        return nameOfDay[day - 1];
    }

    public static int find(int[] a, int element) {

        // -1就表示没找到
        int index = -1;

        for (int i = 0; i < a.length; i++) {
            if (a[i] == element) {
                // 找到了指定的元素
                index = i;
                break;
            }
        }

        return index;
    }
}
